Make double-clicking between words select whitespace. (#309860, Mike
authorMatthias Clasen <mclasen@redhat.com>
Mon, 11 Jul 2005 16:39:44 +0000 (16:39 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 11 Jul 2005 16:39:44 +0000 (16:39 +0000)
2005-07-11  Matthias Clasen  <mclasen@redhat.com>

* gtk/gtktextview.c (extend_selection): Make double-clicking
between words select whitespace.  (#309860, Mike Miller, patch
by Paolo Borelli)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gtk/gtktextview.c

index 37a57d653d2f0b9cc048bf71fc26e25271b3672b..a73479ad3011d0e24fb309127789873a200de61c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2005-07-11  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktextview.c (extend_selection): Make double-clicking
+       between words select whitespace.  (#309860, Mike Miller, patch
+       by Paolo Borelli)
+
        * gtk/gtkiconview.c: Documentation improvements.  (#309946, 
        Torsten Schoenfeld)
 
index 37a57d653d2f0b9cc048bf71fc26e25271b3672b..a73479ad3011d0e24fb309127789873a200de61c 100644 (file)
@@ -1,5 +1,9 @@
 2005-07-11  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktextview.c (extend_selection): Make double-clicking
+       between words select whitespace.  (#309860, Mike Miller, patch
+       by Paolo Borelli)
+
        * gtk/gtkiconview.c: Documentation improvements.  (#309946, 
        Torsten Schoenfeld)
 
index 37a57d653d2f0b9cc048bf71fc26e25271b3672b..a73479ad3011d0e24fb309127789873a200de61c 100644 (file)
@@ -1,5 +1,9 @@
 2005-07-11  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktextview.c (extend_selection): Make double-clicking
+       between words select whitespace.  (#309860, Mike Miller, patch
+       by Paolo Borelli)
+
        * gtk/gtkiconview.c: Documentation improvements.  (#309946, 
        Torsten Schoenfeld)
 
index 2a11b9ef91290f430725382340973ab0739a70d0..9a1aa7300721b0640f7fb4bc5a95a08dcde88c73 100644 (file)
@@ -5520,17 +5520,17 @@ typedef enum
 
 /*
  * Move @start and @end to the boundaries of the selection unit (indicated by 
- * @granularity) which contained @start initially. Return whether @start was
- * contained in a selection unit at all (which may not be the case for words).
+ * @granularity) which contained @start initially.
+ * If the selction unit is SELECT_WORDS and @start is not contained in a word
+ * the selection is extended to all the white spaces between the end of the 
+ * word preceding @start and the start of the one following.
  */
-static gboolean 
+static void
 extend_selection (GtkTextView *text_view, 
                  SelectionGranularity granularity, 
                  GtkTextIter *start, 
                  GtkTextIter *end)
 {
-  gboolean extend = TRUE;
-
   *end = *start;
 
   if (granularity == SELECT_WORDS) 
@@ -5547,7 +5547,30 @@ extend_selection (GtkTextView *text_view,
            }
        }
       else
-       extend = FALSE;
+       {
+         GtkTextIter tmp;
+
+         tmp = *start;
+         if (gtk_text_iter_backward_visible_word_start (&tmp))
+           gtk_text_iter_forward_visible_word_end (&tmp);
+
+         if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (start))
+           *start = tmp;
+         else
+           gtk_text_iter_set_line_offset (start, 0);
+
+         tmp = *end;
+         if (!gtk_text_iter_forward_visible_word_end (&tmp))
+           gtk_text_iter_forward_to_end (&tmp);
+
+         if (gtk_text_iter_ends_word (&tmp))
+           gtk_text_iter_backward_visible_word_start (&tmp);
+
+         if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (end))
+           *end = tmp;
+         else
+           gtk_text_iter_forward_to_line_end (end);
+       }
     }
   else if (granularity == SELECT_LINES) 
     {
@@ -5570,8 +5593,6 @@ extend_selection (GtkTextView *text_view,
            gtk_text_view_forward_display_line_end (text_view, end);
        }
     }
-  
-  return extend;
 }
  
 static gint
@@ -5602,63 +5623,59 @@ selection_motion_event_handler (GtkTextView *text_view, GdkEventMotion *event, g
                                         event->x + text_view->xoffset,
                                         event->y + text_view->yoffset); 
       
-      if (extend_selection (text_view, granularity, &start, &end)) 
-       {
-         /* Extend selection */
-         gtk_text_buffer_get_iter_at_mark (buffer, 
-                                           &ins, 
-                                           gtk_text_buffer_get_insert (buffer));
-         gtk_text_buffer_get_iter_at_mark (buffer, 
+      extend_selection (text_view, granularity, &start, &end);
+
+      /* Extend selection */
+      gtk_text_buffer_get_iter_at_mark (buffer, 
+                                       &ins, 
+                                       gtk_text_buffer_get_insert (buffer));
+      gtk_text_buffer_get_iter_at_mark (buffer, 
                                            &bound,
                                            gtk_text_buffer_get_selection_bound (buffer));
 
-         if (gtk_text_iter_compare (&ins, &bound) < 0) 
-           {
-             old_start = ins;
-             old_end = bound;
-           }
-         else
-           {
-             old_start = bound;
-             old_end = ins;
-           }
-
-         if (gtk_text_iter_compare (&start, &old_start) < 0) 
-           {
-             /* newly selected unit before the current selection */
-             ins = start;
-             bound = old_end;
-           }
-         else if (gtk_text_iter_compare (&old_end, &end) < 0)
-           {
-             /* newly selected unit after the current selection */
-             ins = end;
-             bound = old_start;
-           }
-         else if (gtk_text_iter_equal (&ins, &old_start)) 
-           {
-             /* newly selected unit inside the current selection 
-                at the start */
-             if (!gtk_text_iter_equal (&ins, &start)) 
-               ins = end;
-           }
-         else
-           {
-             /* newly selected unit inside the current selection 
-                at the end */
-             if (!gtk_text_iter_equal (&ins, &end)) 
-                 ins = start;
-           }
+      if (gtk_text_iter_compare (&ins, &bound) < 0) 
+       {
+         old_start = ins;
+         old_end = bound;
+       }
+      else
+       {
+         old_start = bound;
+         old_end = ins;
+       }
 
-         gtk_text_buffer_select_range (buffer, &ins, &bound);
+      if (gtk_text_iter_compare (&start, &old_start) < 0) 
+       {
+         /* newly selected unit before the current selection */
+         ins = start;
+         bound = old_end;
+       }
+      else if (gtk_text_iter_compare (&old_end, &end) < 0)
+       {
+         /* newly selected unit after the current selection */
+         ins = end;
+         bound = old_start;
+       }
+      else if (gtk_text_iter_equal (&ins, &old_start)) 
+       {
+         /* newly selected unit inside the current selection at the start */
+         if (!gtk_text_iter_equal (&ins, &start))
+           ins = end;
+       }
+      else
+       {
+         /* newly selected unit inside the current selection at the end */
+         if (!gtk_text_iter_equal (&ins, &end))
+           ins = start;
        }
 
+      gtk_text_buffer_select_range (buffer, &ins, &bound);
+
       gtk_text_view_scroll_mark_onscreen (text_view, 
                                          gtk_text_buffer_get_mark (buffer,
                                                                    "insert"));
     }
 
-  
   /* If we had to scroll offscreen, insert a timeout to do so
    * again. Note that in the timeout, even if the mouse doesn't
    * move, due to this scroll xoffset/yoffset will have changed